1W - 간단한 장애 상황 구현 후 대응 실습

개요

이번에는 간단하게 에러가 나는 상황을 만들고, 이를 서비스 메시의 기능으로 대응하는 실습을 해본다.
이전에 전체적인 개념 설명을 끝냈으므로 바로 실습을 진행할 것이다.

실습 진행

여태 이스티오 문서에서 예제로 제공해준 bookInfo를 이용해서 실습을 진행하고 있다.
책에서는 독자적인 예제를 사용해 랜덤하게 에러를 발생시킨 후 재시도 횟수를 늘려 성공률을 높이는 실습을 보여주는데, 이스티오 공식 문서에 bookInfo 실습 관련 문서와, 예제 양식 파일을 봤을 때는 비슷하게 실습할 수 있는 설정이 없었다.
bookInfo에서 진행할 수 있는 에러 주입 관련 실습은 다음과 같은 방식이다.

그러나 직접적으로 소스 코드를 파보니 애플리케이션 단에서 에러를 발생시킬 수 있는 설정을 찾을 수 있었다.[1]
문서를 조금 더 제대로 뒤져보면 관련한 부분이 나올지도 모르겠다.
image.png
rating 어플리케이션에 환경 변수 설정을 통해 데이터소스로 mysql이나 몽고 db를 사용할 수 있도록 돼있다.
근데 여기에 추가적으로 에러를 발생시킬 수 있도록 코드가 세팅돼있다.
그래서 파드 환경 변수로 특정 값을 설정하여 에러를 확률적으로 발생시키는 것이 가능하다.
이를 활용해 책의 예제와 비슷하게, 재시도 횟수를 늘리는 것만으로 성공률을 높이는 실습을 해보겠다.

에러 발생시키기

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ratings-v1
  labels:
    app: ratings
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ratings
      version: v1
  template:
    metadata:
      labels:
        app: ratings
        version: v1
    spec:
      serviceAccountName: bookinfo-ratings
      containers:
      - name: ratings
        image: docker.io/istio/examples-bookinfo-ratings-v1:1.20.2
        imagePullPolicy: IfNotPresent
        env:
          - name: SERVICE_VERSION
            value: v-faulty
        ports:
        - containerPort: 9080

일단 에러를 발생하게 하는 것은 간단하다.
rating 디플로이먼트에서 컨테이너에 환경 변수로 SERVICE_VERSION을 세팅해주기만 하면 끝이다.
에러 상황과 관련한 값들은 다음의 것들이 있다.

v1, v2 같은 값을 세팅하면 mysql과 mongodb를 데이터 소스로 두는 설정이 된다.
image.png
보다시피 ratings에서 50퍼센트 확률로 에러가 발생 중이다.

재시도 설정을 통해 에러율 개선

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - retries:
      attempts: 5
      perTryTimeout: 7s
      retryOn: 5xx
    route:
      - destination:
          host: ratings

ratings에 재시도 설정을 넣는 virtualservice 리소스를 만든다.
참고로 아무 설정을 하지 않으면 클러스터 전역 설정에 기반해 재시도를 하게 되는데 재시도는 2회, 재시도 발동 조건은 500에러나 커넥션 닫힘 등이 세팅된다.
image.png
참고로 telemetry api를 제대로 세팅하기 이전의 사진으로, 이것 때문에 조금 헤맸다.
아무리 기다리고, 재시도 횟수를 20회로 높이기까지 했는데도 에러율에 변화가 없었다.
50퍼센트 확률로 실패하는 서버에 5번의 재시도를 하게 된다면 최종 실패 확률은 1/32인데, 아무리 기다려도 그 정도의 에러율로 내려가지 않는다.
이렇게 표시되는 이유는 키알리에서 가져오는 프로메테우스 메트릭 때문이다.
기본 설정으로 이스티오는 서비스 간 트래픽에서 서버의 메트릭과 클라이언트의 메트릭을 전부 수집한다.
이것 때문에 에러로 인한 재시도를 할 때, 해당 에러까지 메트릭으로서 표시되고 이것을 키알리가 수집하기 때문에 에러율에서는 변화가 관측되지 않는 것이다.
image.png
하지만 막상 로그를 뜯어보면, 재시도 횟수가 제대로 반영이 되어 200이 잘 뜨고 있는 걸 볼 수 있다.
image.png
정말 간혹 가다 503에러가 뜨는 것을 확인할 수 있다.
image.png
트래픽 그래프에서 오른쪽에 나오는 값을 봐도 에러율이 현저하게 줄어든 것이 제대로 표시된다.
image.png
예거로 확인해봤을 때도, 에러로 표시되는 요청들 중 상당 수는 여러 재시도를 거쳐서 결국 성공한 트레이스라는 것을 확인할 수 있다.
즉, 키알리에서 그래프로 표시하는 에러율은 그저 트래픽이 전송 과정 상에서 에러가 한번이라도 발생했을 때 에러로 표시하고 있기에 변화가 없는 것처럼 보인다는 것이 확실하다.
image.png
그라파나에서 역시 설정에 맞게 정직하게 에러율을 표시해주고 있다.
일단 실제 트래픽 장애율이 줄어드는 것은 확인했으니 이스티오의 기본 실습 코드에 대한 테스트는 마치고자 한다.

결론

어플리케이션 단에서 발생하는 에러가 간헐적이라면, 위와 같이 재시도 횟수를 늘리는 것만으로 성공률을 높일 수 있다.
이밖에도 응답 지연시간에 대한 타임아웃을 세팅하여 정상 트래픽의 범주를 명확히 하는 것도 가능하다.
공식 문서에서는 에러가 많이 나는 버전에 대해 아예 트래픽 분산 비율을 줄이는 설정을 보여주기도 하는데, 어플리케이션 로직에 대한 수정을 하지 않고도 인프라 단에서 각종 에러를 대응할 수 있다는 것도 이스티오의 큰 매력 중 하나라고 생각이 든다.

에러가 나더라도 서비스 메시에 모니터링 설정을 통해 간편하게 에러를 파악할 수 있어 빠르게 확인하고 대응하기에 용이하다.

이전 글, 다음 글

다른 글 보기

이름 index noteType created
1W - 서비스 메시와 이스티오 1 published 2025-04-10
1W - 간단한 장애 상황 구현 후 대응 실습 2 published 2025-04-10
1W - Gateway API를 활용한 설정 3 published 2025-04-10
1W - 네이티브 사이드카 컨테이너 이용 4 published 2025-04-10
2W - 엔보이 5 published 2025-04-19
2W - 인그레스 게이트웨이 실습 6 published 2025-04-17
3W - 버츄얼 서비스를 활용한 기본 트래픽 관리 7 published 2025-04-22
3W - 트래픽 가중치 - flagger와 argo rollout을 이용한 점진적 배포 8 published 2025-04-22
3W - 트래픽 미러링 패킷 캡쳐 9 published 2025-04-22
3W - 서비스 엔트리와 이그레스 게이트웨이 10 published 2025-04-22
3W - 데스티네이션 룰을 활용한 네트워크 복원력 11 published 2025-04-26
3W - 타임아웃, 재시도를 활용한 네트워크 복원력 12 published 2025-04-26
4W - 이스티오 메트릭 확인 13 published 2025-05-03
4W - 이스티오 메트릭 커스텀, 프로메테우스와 그라파나 14 published 2025-05-03
4W - 오픈텔레메트리 기반 트레이싱 예거 시각화, 키알리 시각화 15 published 2025-05-03
4W - 번외 - 트레이싱용 심플 메시 서버 개발 16 published 2025-05-03
5W - 이스티오 mTLS와 SPIFFE 17 published 2025-05-11
5W - 이스티오 JWT 인증 18 published 2025-05-11
5W - 이스티오 인가 정책 설정 19 published 2025-05-11
6W - 이스티오 설정 트러블슈팅 20 published 2025-05-18
6W - 이스티오 컨트롤 플레인 성능 최적화 21 published 2025-05-18
8W - 가상머신 통합하기 22 published 2025-06-01
8W - 엔보이와 iptables 뜯어먹기 23 published 2025-06-01
9W - 앰비언트 모드 구조, 원리 24 published 2025-06-07
9W - 앰비언트 헬름 설치, 각종 리소스 실습 25 published 2025-06-07
7W - 이스티오 메시 스케일링 26 published 2025-06-09
7W - 엔보이 필터를 통한 기능 확장 27 published 2025-06-09

관련 문서

이름 noteType created
25.05 테크니컬 라이팅 area 2025-05-07
Envoy knowledge 2025-04-07
Istio Telemetry knowledge 2025-04-08
Istio Gateway knowledge 2025-04-16
Istio ServiceEntry knowledge 2025-04-17
Istio VirtualService knowledge 2025-04-21
Istio DestinationRule knowledge 2025-04-21
Istio EnvoyFilter knowledge 2025-04-21
Istio WasmPlugin knowledge 2025-04-21
아르고 롤아웃과 이스티오 연계 knowledge 2025-04-22
pilot-agent knowledge 2025-04-28
Kiali knowledge 2025-04-28
Istio PeerAuthentication knowledge 2025-05-04
Istio RequestAuthentication knowledge 2025-05-04
Istio AuthorizationPolicy knowledge 2025-05-04
Istio Operator knowledge 2025-05-09
istioctl knowledge 2025-05-12
Istio Sidecar knowledge 2025-05-13
Istio ProxyConfig knowledge 2025-05-17
istiod knowledge 2025-05-18
사이드카 모드 knowledge 2025-05-18
메시 배포 모델 knowledge 2025-05-21
Istio WorkloadGroup knowledge 2025-05-26
Istio WorkloadEntry knowledge 2025-05-26
앰비언트 모드 knowledge 2025-06-02
책 내용 정리 project 2025-04-03
스터디 내용 사전 정리 project 2025-04-03
1주차 - istio 소개, 첫걸음 project 2025-04-06
2주차 - 엔보이, 게이트웨이 project 2025-04-13
3주차 - 트래픽 관리 project 2025-04-19
3주차 - 네트워크 복원력 project 2025-04-23
4주차 - 이스티오 관측가능성 project 2025-04-27
5주차 - 통신 보안 project 2025-05-04
6주차 - 디버깅 project 2025-05-11
7주차 - 스케일링, 멀티 클러스터 project 2025-05-18
1W - 서비스 메시와 이스티오 published 2025-04-10
1W - 간단한 장애 상황 구현 후 대응 실습 published 2025-04-10
1W - Gateway API를 활용한 설정 published 2025-04-10
1W - 네이티브 사이드카 컨테이너 이용 published 2025-04-10
2W - 인그레스 게이트웨이 실습 published 2025-04-17
2W - 엔보이 published 2025-04-19
3W - 버츄얼 서비스를 활용한 기본 트래픽 관리 published 2025-04-22
3W - 트래픽 가중치 - flagger와 argo rollout을 이용한 점진적 배포 published 2025-04-22
3W - 트래픽 미러링 패킷 캡쳐 published 2025-04-22
3W - 서비스 엔트리와 이그레스 게이트웨이 published 2025-04-22
3W - 데스티네이션 룰을 활용한 네트워크 복원력 published 2025-04-26
3W - 타임아웃, 재시도를 활용한 네트워크 복원력 published 2025-04-26
4W - 이스티오 메트릭 확인 published 2025-05-03
4W - 이스티오 메트릭 커스텀, 프로메테우스와 그라파나 published 2025-05-03
4W - 번외 - 트레이싱용 심플 메시 서버 개발 published 2025-05-03
4W - 오픈텔레메트리 기반 트레이싱 예거 시각화, 키알리 시각화 published 2025-05-03
5W - 이스티오 mTLS와 SPIFFE published 2025-05-11
5W - 이스티오 JWT 인증 published 2025-05-11
5W - 이스티오 인가 정책 설정 published 2025-05-11
6W - 이스티오 설정 트러블슈팅 published 2025-05-18
6W - 이스티오 컨트롤 플레인 성능 최적화 published 2025-05-18
8W - 가상머신 통합하기 published 2025-06-01
8W - 엔보이와 iptables 뜯어먹기 published 2025-06-01
9W - 앰비언트 모드 구조, 원리 published 2025-06-07
9W - 앰비언트 헬름 설치, 각종 리소스 실습 published 2025-06-07
7W - 이스티오 메시 스케일링 published 2025-06-09
7W - 엔보이 필터를 통한 기능 확장 published 2025-06-09
이스티오 스케일링 topic 2025-05-18
엔보이에 와즘 플러그인 적용해보기 topic 2025-06-09
E-이스티오 설정 트러블슈팅하기 topic/explain 2025-05-18
E-이스티오 컨트롤 플레인 성능 최적화 topic/explain 2025-05-18
E-이스티오 컨트롤 플레인 메트릭 topic/explain 2025-05-18
E-이스티오의 데이터 플레인 트래픽 세팅 원리 topic/explain 2025-05-27
E-deb 파일 뜯어보기 topic/explain 2025-06-01
E-이스티오 DNS 프록시 동작 topic/explain 2025-06-01
E-이스티오 가상머신 통합 topic/explain 2025-06-01
E-이스티오에서 엔보이 기능 확장하기 topic/explain 2025-06-01
E-앰비언트 모드 헬름 세팅 topic/explain 2025-06-03
E-앰비언트 ztunnel 트래픽 경로 분석 topic/explain 2025-06-07
E-앰비언트 모드에서 메시 기능 활용 topic/explain 2025-06-07
E-이스티오 메시 스케일링 topic/explain 2025-06-08
E-istio-csr 사용 실습 topic/explain 2025-06-09
I-다른 네임스페이스 같은 포트 리스닝 서버 구현 topic/idea 2025-06-07
I-ztunnel이 다른 네임스페이스에서 요청 보내는 코드 분석 topic/idea 2025-06-07
T-엔보이 실습 with solo.io topic/temp 2025-04-14

참고


  1. https://github.com/istio/istio/tree/master/samples/bookinfo/src ↩︎